package main

import "fmt"

//使用传统的方法不利于数据的管理和维护
//传统的方法不够灵活，因此要学习新的数据类型——数组
/*
1介绍：
数组可以存放多个同一数据类型，数组也是一种数据类型，在Go中，数组是值类型
2数组定义：
var 数组名 [数组大小]数据类型
var a [5]int
赋初值 a[0]=1 a[1]=30...
3数组使用
访问数组元素：
数组名[下标]
*/
func main() {
	//定义一个数组
	var hens [6]float64
	//给数组的每个元素赋值，元素的小标从0开始
	hens[0] = 3.0
	hens[1] = 5.0
	hens[2] = 1.0
	hens[3] = 3.4
	hens[4] = 2.0
	hens[5] = 50.0
	//遍历数组求出总体重
	totalWeight := 0.0
	for i := 0; i < len(hens); i++ {
		totalWeight += hens[i]
	}
	//求出平均体重
	avgWeight := fmt.Sprintf("%.2f", totalWeight/float64(len(hens)))
	fmt.Printf("totalWeight=%v avgWeight=%v\n", totalWeight, avgWeight)

	var intArr [3]int
	//当定义完数组后，其实数组的各个元素有默认值0
	fmt.Println(intArr)
	//数组的地址可以通过数组名来获取&intArr
	//数组的第一个元素的地址，就是数组的首地址
	//数组的各个元素的地址间隔是根据数组的类型决定，比如int64->8 int32->4
	fmt.Printf("intArr的地址=%p intArr[0]地址%p intArr[1]地址%p intArr[2]地址%p\n",
		&intArr, &intArr[0], &intArr[1], &intArr[2])

	//从终端循环输入5个成绩，保存到float64数组，并输出
	var score [5]float64
	for i := 0; i < len(score); i++ {
		fmt.Printf("请输入第%d个元素的值\n", i+1)
		fmt.Scanln(&score[i])
	}
	//变量数组打印
	for i := 0; i < len(score); i++ {
		fmt.Printf("score[%d]=%v\n", i, score[i])
	}

	//四种初始化数组的方式
	var numArr01 [3]int = [3]int{1, 2, 3}
	fmt.Println("numArr01=", numArr01)

	var numArr02 = [3]int{5, 6, 7}
	fmt.Println("numArr02=", numArr02)

	//这里的[...]是规定的写法
	var numArr03 = [...]int{8, 9, 10}
	fmt.Println("numArr03=", numArr03)

	var numArr04 = [...]int{1: 800, 0: 900, 2: 999}
	fmt.Println("numArr04=", numArr04)

	//类型推导
	strArr05 := [...]string{1: "tom", 0: "jack", 2: "mary"}
	fmt.Println("strArr05=", strArr05)
}
